import java.net.*;
import java.io.*;
/*
 * @author HuGo LouReNCo 100915
 */
public class ClientePut {

	public static void main(String[] args) {
		Socket socket = null;
		String host;
		int portaServidor;

		if (args.length == 0) {
			host = "localhost";
			portaServidor = 60988;
		} else {
			host = args[0];
			String portStr = args[1];
			try {
				portaServidor = Integer.parseInt(portStr);
			} catch (NumberFormatException e) {
				System.out.println("Erro nos argumentos:" + e.getMessage());
				portaServidor = 60988;
			}
		}

		try {
			// criando conexao com o servidor
			socket = new Socket(InetAddress.getByAddress(new byte[] {
					(byte) 192, (byte) 168, (byte) 25, (byte) 14 }), 60988);

			// pegar os streams Input e Output
			DataOutputStream saidaDOS = new DataOutputStream(
					socket.getOutputStream());

			DataInputStream entrada = new DataInputStream(
					socket.getInputStream());
			File arquivo;
			arquivo = new File("20MB.pdf");
			FileInputStream entradaFIS = new FileInputStream(arquivo);

			// mede o tempo inicio
			long tempoInicio = System.currentTimeMillis();

			// enviando dados para o servidor
			System.out.println("Transferindo o arquivo: " + arquivo.getName());
			saidaDOS.writeUTF("PUT");
			saidaDOS.writeUTF(arquivo.getName());
			saidaDOS.writeLong(arquivo.length());

			byte[] buffer = new byte[4096];
			int tamanho;
			while ((tamanho = entradaFIS.read(buffer)) != -1) {
				saidaDOS.write(buffer, 0, tamanho);
			}

			// tempo do fim
			long tempoFim = System.currentTimeMillis();
			// calcula o tempo em segundos
			double tempo = ((double) tempoFim - (double) tempoInicio) / 1000.0;

			// arquivo enviado
			saidaDOS.close();
			// fechando conexao
			socket.close();
			System.out.printf("\nTransferencia concluida.\nTaxa: %.3f segundos", tempo);
			
			// gravando taxa no arquivo
			File resultado;

			resultado = new File("resultado.txt");
			FileOutputStream fos = new FileOutputStream(resultado);
			String texto = "\nTaxa: " + tempo;
			fos.write(texto.getBytes());
			fos.close();
			
		} catch (UnknownHostException e) {
			System.out.println("Socket:" + e.getMessage());
		} catch (EOFException e) {
			System.out.println("EOF:" + e.getMessage());
		} catch (IOException e) {
			System.out.println("IOF:" + e.getMessage());
		} finally {
			if (socket != null)
				try {
					socket.close();
				} catch (IOException e) {
					System.out.println("IOF:" + e.getMessage());
				}
		}
	}
}